home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / comm / tcp / Amster-source.lha / Amster_Install / Source / prefs.c < prev    next >
C/C++ Source or Header  |  2001-03-11  |  42KB  |  1,175 lines

  1. /*
  2. ** Amster - Preferences
  3. ** Copyright © 1999-2000 by Gürer Özen
  4. ** Copyright © 2000-2001 by Jacob Laursen
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. **
  16. ** You should have received a copy of the GNU General Public License
  17. ** along with this program; if not, write to the Free Software
  18. ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. */
  20.  
  21. #include "amster.h"
  22.  
  23. #include <MUI/NListview_mcc.h>
  24. #include <MUI/textinput_mcc.h>
  25. #include <libraries/asl.h>
  26.  
  27. #include <proto/dos.h>
  28.  
  29. #include "amster_Cat.h"
  30.  
  31. struct prefsdata myprefs;
  32. struct prefsdata *prf = &myprefs;
  33.  
  34. int prf_eventflags[] = { 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1 };
  35.  
  36. struct MUI_CustomClass *QueueClass;
  37.  
  38. MUI_DISPATCH_DECL(QueueDispatcher);
  39. ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg);
  40. void prf_set(struct prfdata *data);
  41. void prf_use(struct prfdata *data);
  42. void snd_play(char *fname);
  43. void prf_entry(struct prfdata *data);
  44.  
  45.  
  46. MUI_DISPATCH(prf_dispatch)
  47. {
  48.     switch(msg->MethodID) {
  49.         case OM_NEW:
  50.             return(prf_new(cl, obj, (APTR)msg));
  51.         case PRF_UPDATE:
  52.             if (gui_onlinestate == ONLINE) nap_sendbuf(NAPC_EMAILCHANGE, prf->email);
  53.             else MUI_Request(gui->app, gui->swin, 0L, (char *)MSG_ERROR_TITLE, (char *)MSG_OK_GAD, (char *)MSG_ERROR_UPDATEEMAIL);
  54.             return NULL;
  55.         case PRF_OPEN:
  56.             prf_set(INST_DATA(cl, obj));
  57.             set(obj, MUIA_Window_Open, TRUE);
  58.             return NULL;
  59.         case PRF_USE:
  60.             prf_use(INST_DATA(cl, obj));
  61.             set(obj, MUIA_Window_Open, FALSE);
  62.             return NULL;
  63.         case PRF_LASTSAVED:
  64.             {
  65.             u_long tmp;
  66.             prf_setup(0, NULL);
  67.             if (prf_load("ENVARC:"AMSTER_PREFS)) {
  68.                 DoMethod(gui->searchpanel, SEARCH_SET);
  69.                 GetAttr(MUIA_Window_Open, obj, &tmp);
  70.                 if (tmp==TRUE) prf_set(INST_DATA(cl,obj));
  71.             }
  72.             return NULL;
  73.             }
  74.         case PRF_SAVE:
  75.             prf_use(INST_DATA(cl, obj));
  76.             set(obj, MUIA_Window_Open, FALSE);
  77.             prf_save("ENVARC:"AMSTER_PREFS);
  78.             return NULL;
  79.         case PRF_SAVEALL:
  80.             {
  81.             u_long tmp;
  82.             GetAttr(MUIA_Window_Open, obj, &tmp);
  83.             if (tmp==TRUE) {
  84.                 prf_use(INST_DATA(cl,obj));
  85.             }
  86.             else prf_save("ENV:"AMSTER_PREFS);
  87.             prf_save("ENVARC:"AMSTER_PREFS);
  88.             return NULL;
  89.             }
  90.         case PRF_CANCEL:
  91.             set(obj, MUIA_Window_Open, FALSE);
  92.             return NULL;
  93.         case PRF_TESTSND:
  94.             {
  95.             u_long tmp;
  96.             struct prfdata *data = INST_DATA(cl,obj);
  97.             GetAttr(MUIA_String_Contents, data->ST_EventSound, &tmp);
  98.             if (((char *)tmp)[0] != '\0') snd_play((char *)tmp);
  99.             return NULL;
  100.             }
  101.         case PRF_ENTRY:
  102.             prf_entry(INST_DATA(cl,obj));
  103.             return NULL;
  104.         case PRF_VALIDDELAY:
  105.             {
  106.             u_long tmp;
  107.             struct prfdata *data = INST_DATA(cl,obj);
  108.             GetAttr(MUIA_String_Integer, data->ST_QueueDelay, &tmp);
  109.             if ((int)tmp < 1) set(data->ST_QueueDelay, MUIA_String_Integer, prf->QueueDelay);
  110.             return NULL;
  111.             }
  112.     }
  113.     return DoSuperMethodA(cl, obj, msg);
  114. }
  115.  
  116.  
  117. /*
  118. ** This is the Queue custom class, a sub class of Slider.mui. Overrides the
  119. ** MUIM_Numeric_Stringify method to implement custom display in slider gadget.
  120. */
  121.  
  122. MUI_DISPATCH(QueueDispatcher)
  123. {
  124.     if (msg->MethodID==MUIM_Numeric_Stringify)
  125.     {
  126.         struct QueueData *data = INST_DATA(cl,obj);
  127.         struct MUIP_Numeric_Stringify *m = (APTR)msg;
  128.  
  129.         if (m->value<26)
  130.         {
  131.             sprintf(data->buf,"%3ld", m->value);
  132.         }
  133.         else
  134.         {
  135.             strcpy(data->buf, MSG_PRF_QUEUE_UNLIMITED);
  136.         }
  137.         return((ULONG)data->buf);
  138.     }
  139.     return(DoSuperMethodA(cl,obj,msg));
  140. }
  141.  
  142.  
  143. ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg)
  144. {
  145.     static char *pages[] = {
  146.         (char *)_MSG_PRF_USER_TAB,
  147.         (char *)_MSG_PRF_OPTIONS_TAB,
  148.         (char *)_MSG_PRF_EVENTS_TAB,
  149.         (char *)_MSG_PRF_ADVANCED_TAB,
  150.         NULL
  151.     };
  152.     static char *events[] = {
  153.         (char *)_MSG_PRF_EVT_START,
  154.         (char *)_MSG_PRF_EVT_EXIT,
  155.         (char *)_MSG_PRF_EVT_CONN,
  156.         (char *)_MSG_PRF_EVT_DISC,
  157.         (char *)_MSG_PRF_EVT_DOWNLOAD_START,
  158.         (char *)_MSG_PRF_EVT_DLFIN,
  159.         (char *)_MSG_PRF_EVT_DOWNLOAD_ERROR,
  160.         (char *)_MSG_PRF_EVT_DOWNLOAD_ABORT,
  161.         (char *)_MSG_PRF_EVT_UPLOAD_START,
  162.         (char *)_MSG_PRF_EVT_ULFIN,
  163.         (char *)_MSG_PRF_EVT_UPLOAD_ERROR,
  164.         (char *)_MSG_PRF_EVT_UPLOAD_ABORT,
  165.         (char *)_MSG_PRF_EVT_INCOMINGMSG,
  166.         (char *)_MSG_PRF_EVT_LIBRARY_DOUBLECLICK,
  167.         (char *)_MSG_PRF_EVT_DOWNLOAD_DOUBLECLICK,
  168.         (char *)_MSG_PRF_EVT_PLAY,
  169.         NULL
  170.     };
  171.     static char *lamps[] = {
  172.         (char *)_MSG_PRF_LAMPLAMP,
  173.         (char *)_MSG_PRF_LAMPTWF,
  174.         NULL
  175.     };
  176.     static char *ServerListOpts[] = {
  177.         (char *)_MSG_PRF_SERVERLIST_FORGET,
  178.         (char *)_MSG_PRF_SERVERLIST_SAVE,
  179.         (char *)_MSG_PRF_SERVERLIST_CACHE,
  180.         NULL
  181.     };
  182.     static char *AutoCleanupOpts[] = {
  183.         (char *)_MSG_PRF_AUTOCLEANUP_NONE,
  184.         (char *)_MSG_PRF_AUTOCLEANUP_DOWNLOADS,
  185.         (char *)_MSG_PRF_AUTOCLEANUP_UPLOADS,
  186.         (char *)_MSG_PRF_AUTOCLEANUP_BOTH,
  187.         NULL
  188.     };
  189.  
  190.     struct prfdata *data;
  191.     Object *ST_User, *ST_Password, *ST_EMail, *EMailButton, *TG_BypassReg;
  192.     Object *ST_DLPath, *CY_LinkSpeed;
  193.     Object *TG_ClearList, *TG_AutoConnect, *TG_AskFile, *TG_AutoSave, *TG_AutoAdd;
  194.     Object *CY_Lamp, *CY_ServerList, *CY_AutoCleanup, *ST_NameLength;
  195.     Object *LI_Event, *ST_EventScript, *ST_EventSound, *BT_EventTest;
  196.     Object *ST_MetaServer, *ST_MetaPort, *ST_Server, *ST_LeafPort, *ST_Port, *TG_Firewall;
  197.     Object *SL_DownloadQueue, *SL_UploadQueue, *SL_DownloadPri, *SL_UploadPri;
  198.     Object *ST_QueueRetries, *ST_QueueDelay;
  199.     Object *BT_Save, *BT_Use, *BT_Cancel;
  200.  
  201.     QueueClass = MUI_CreateCustomClass(NULL, MUIC_Slider, NULL, sizeof(struct QueueData), &QueueDispatcher);
  202.  
  203.     if (pages[0] == (char *)_MSG_PRF_USER_TAB)
  204.         localize_array(pages);
  205.     if (events[0] == (char *)_MSG_PRF_EVT_START)
  206.         localize_array(events);
  207.     if (lamps[0] == (char *)_MSG_PRF_LAMPLAMP)
  208.         localize_array(lamps);
  209.     if (ServerListOpts[0] == (char *)_MSG_PRF_SERVERLIST_FORGET)
  210.         localize_array(ServerListOpts);
  211.     if (AutoCleanupOpts[0] == (char *)_MSG_PRF_AUTOCLEANUP_NONE)
  212.         localize_array(AutoCleanupOpts);
  213.  
  214.     if (obj = (Object *)DoSuperNew(cl, obj,
  215.         MUIA_HelpNode, "config",
  216.         MUIA_Window_Title, MSG_PRF_TITLE,
  217.         MUIA_Window_ID, MAKE_ID('S','E','T','T'),
  218.         WindowContents, VGroup,
  219.             Child, RegisterGroup(pages),
  220.             Child, VGroup,
  221.                 Child, ColGroup(2), GroupFrameT(MSG_PRF_ACCOUNT_FRAME),
  222.                     MUIA_HelpNode, "conf-user",
  223.                     Child, Label2(MSG_PRF_USERNAME),
  224.                     Child, HGroup,
  225.                     Child, ST_User = TextinputObject,
  226.                         StringFrame,
  227.                         MUIA_Textinput_Multiline, FALSE,
  228.                         MUIA_String_Reject, ":%$ ",
  229.                         MUIA_String_AdvanceOnCR, TRUE,
  230.                         MUIA_CycleChain, 1,
  231.                         MUIA_ShortHelp, MSG_PRF_USERNAME_HELP,
  232.                     End,
  233.                         Child, Label2(MSG_PRF_BYPASS_REGISTRATION),
  234.                         Child, TG_BypassReg = ImageObject,
  235.                             ButtonFrame,
  236.                             MUIA_HorizWeight, 10,
  237.                             MUIA_Background, MUII_ButtonBack,
  238.                             MUIA_InputMode, MUIV_InputMode_Toggle,
  239.                             MUIA_ShowSelState, FALSE,
  240.                             MUIA_Image_Spec, "6:15",
  241.                             MUIA_Selected, FALSE,
  242.                             MUIA_ShortHelp, MSG_PRF_BYPASS_REGISTRATION_HELP,
  243.                         End,
  244.                         End,
  245.                     Child, Label2(MSG_PRF_PASSWORD),
  246.                     Child, ST_Password = StringObject,
  247.                         StringFrame,
  248.                         MUIA_String_Reject, " ",
  249.                         MUIA_String_AdvanceOnCR, TRUE,
  250.                         MUIA_String_Secret, TRUE,
  251.                         MUIA_CycleChain, 1,
  252.                         MUIA_ShortHelp, MSG_PRF_PASSWORD_HELP,
  253.                     End,
  254.                     Child, Label2(MSG_PRF_EMAIL),
  255.                     Child, HGroup,
  256.                         Child, ST_EMail = TextinputObject,
  257.                             StringFrame,
  258.                             MUIA_Textinput_Multiline, FALSE,
  259.                             MUIA_HorizWeight, 150,
  260.                             MUIA_String_AdvanceOnCR, TRUE,
  261.                             MUIA_CycleChain, 1,
  262.                             MUIA_ShortHelp, MSG_PRF_EMAIL_HELP,
  263.                         End,
  264.                         Child, EMailButton = SimpleButton(MSG_PRF_UPDATE_GAD),
  265.                             MUIA_ShortHelp, MSG_PRF_UPDATE_HELP,
  266.                     End,
  267.                     Child, Label2(MSG_PRF_CONNECTION),
  268.                     Child, CY_LinkSpeed = CycleObject,
  269.                         MUIA_Cycle_Active, prf->link,
  270.                         MUIA_Cycle_Entries, nap_linktype,
  271.                         MUIA_ShortHelp, MSG_PRF_CONNECTION_HELP,
  272.                     End,
  273.                 End,
  274.                 Child, ColGroup(2),
  275.                     Child, Label2(MSG_PRF_DLPATH),
  276.                     Child, HGroup,
  277.                         Child, ST_DLPath = PopaslObject,
  278.                             MUIA_Popstring_String, TextinputObject,
  279.                                 StringFrame,
  280.                                 MUIA_Textinput_Multiline, FALSE,
  281.                                 MUIA_String_MaxLen, 256,
  282.                                 MUIA_CycleChain, 1,
  283.                                 MUIA_ShortHelp, MSG_PRF_DLPATH_HELP,
  284.                             End,
  285.                             MUIA_Popstring_Button, PopButton(MUII_PopFile),
  286.                             MUIA_Popasl_Type, ASL_FileRequest,
  287.                             ASLFR_TitleText, MSG_PRF_DLPATH_REQ,
  288.                             ASLFR_DrawersOnly, TRUE,
  289.                         End,
  290.                         Child, Label2(MSG_PRF_NAMELENGTH),
  291.                         Child, ST_NameLength = TextinputObject,
  292.                             StringFrame,
  293.                             MUIA_Textinput_Multiline, FALSE,
  294.                             MUIA_HorizWeight, 25,
  295.                             MUIA_String_Integer, prf->NameLength,
  296.                             MUIA_String_Accept, "0123456789",
  297.                             MUIA_String_MaxLen, 4,
  298.                             MUIA_CycleChain, 1,
  299.                             MUIA_ShortHelp, MSG_PRF_NAMELENGTH_HELP,
  300.                         End,
  301.                     End,
  302.                 End,
  303.             End,
  304.             Child, VGroup,
  305.                 MUIA_HelpNode, "conf-opts",
  306.                 Child, VGroup, GroupFrameT(MSG_PRF_MISC_FRAME),
  307.                     Child, maketoggle(MSG_PRF_AUTOCONNECT,  &TG_AutoConnect),
  308.                     Child, maketoggle(MSG_PRF_CLEARLIST,    &TG_ClearList  ),
  309.                     Child, maketoggle(MSG_PRF_ALWAYSASK,    &TG_AskFile    ),
  310.                     Child, maketoggle(MSG_PRF_ADDTOLIBRARY, &TG_AutoAdd    ),
  311.                     Child, maketoggle(MSG_PRF_AUTOSAVELIB,  &TG_AutoSave   ),
  312.                 End,
  313.                 Child, ColGroup(2),
  314.                     Child, Label2(MSG_PRF_AUTOCLEANUP_TMP),
  315.                     Child, CY_AutoCleanup = CycleObject,
  316.                         MUIA_Cycle_Active, prf->AutoCleanup,
  317.                         MUIA_Cycle_Entries, AutoCleanupOpts,
  318.                         MUIA_ShortHelp, MSG_PRF_AUTOCLEANUP_HELP,
  319.                     End,
  320.                     Child, Label2(MSG_PRF_SERVERLIST),
  321.                     Child, CY_ServerList = CycleObject,
  322.                         MUIA_Cycle_Active, prf->ServerList,
  323.                         MUIA_Cycle_Entries, ServerListOpts,
  324.                         MUIA_ShortHelp, MSG_PRF_SERVERLIST_HELP,
  325.                     End,
  326.                     Child, Label2(MSG_PRF_LAMPCLASS),
  327.                     Child, CY_Lamp = CycleObject,
  328.                         MUIA_Cycle_Active, prf->lamps,
  329.                         MUIA_Cycle_Entries, lamps,
  330.                         MUIA_ShortHelp, MSG_PRF_LAMPCLASS_HELP,
  331.                     End,
  332.                 End,
  333.             End,
  334.             Child, VGroup,
  335.                 MUIA_HelpNode, "conf-events",
  336.                 Child, NListviewObject,
  337.                     MUIA_NListview_NList, LI_Event = NListObject,
  338.                         InputListFrame,
  339.                         MUIA_NList_SourceArray, events,
  340.                     End,
  341.                 End,
  342.                 Child, ColGroup(2),
  343.                     Child, Label2(MSG_PRF_COMMAND),
  344.                     Child, ST_EventScript = PopaslObject,
  345.                         MUIA_Popstring_String, TextinputObject,
  346.                             StringFrame,
  347.                             MUIA_Textinput_Multiline, FALSE,
  348.                             MUIA_String_MaxLen, 256,
  349.                             MUIA_CycleChain, 1,
  350.                             MUIA_ShortHelp, MSG_PRF_COMMAND_HELP,
  351.                         End,
  352.                         MUIA_Popstring_Button, PopButton(MUII_PopFile),
  353.                         MUIA_Popasl_Type, ASL_FileRequest,
  354.                         ASLFR_TitleText, MSG_PRF_SCRIPT_REQ,
  355.                     End,
  356.                     Child, Label2(MSG_PRF_SOUND),
  357.                     Child, HGroup,
  358.                         Child, ST_EventSound = PopaslObject,
  359.                             MUIA_HorizWeight, 300,
  360.                             MUIA_Popstring_String, TextinputObject,
  361.                                 StringFrame,
  362.                                 MUIA_Textinput_Multiline, FALSE,
  363.                                 MUIA_String_MaxLen, 256,
  364.                                 MUIA_CycleChain, 1,
  365.                             End,
  366.                             MUIA_Popstring_Button, PopButton(MUII_PopFile),
  367.                             MUIA_Popasl_Type, ASL_FileRequest,
  368.                             ASLFR_TitleText, MSG_PRF_SOUND_REQ,
  369.                         End,
  370.                         Child, BT_EventTest = SimpleButton(MSG_PRF_SOUNDTEST_GAD),
  371.                     End,
  372.                 End,
  373.             End,
  374.             Child, VGroup,
  375.                 Child, VGroup, GroupFrameT(MSG_PRF_NETWORK_FRAME),
  376.                     Child, ColGroup(2),
  377.                         MUIA_HelpNode, "conf-adv",
  378.                         Child, Label2(MSG_PRF_MAINSERVER),
  379.                         Child, HGroup,
  380.                             Child, ST_MetaServer = TextinputObject,
  381.                                 StringFrame,
  382.                                 MUIA_Textinput_Multiline, FALSE,
  383.                                 MUIA_String_AdvanceOnCR, TRUE,
  384.                                 MUIA_CycleChain, 1,
  385.                                 MUIA_String_Accept, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-",
  386.                                 MUIA_ShortHelp, MSG_PRF_MAINSERVER_HELP,
  387.                             End,
  388.                             Child, Label2(MSG_PRF_SERVER_PORT),
  389.                             Child, ST_MetaPort = TextinputObject,
  390.                                 StringFrame,
  391.                                 MUIA_Textinput_Multiline, FALSE,
  392.                                 MUIA_HorizWeight, 45,
  393.                                 MUIA_String_Integer, prf->MetaPort,
  394.                                 MUIA_String_Accept, "0123456789",
  395.                                 MUIA_String_MaxLen, 6,
  396.                                 MUIA_CycleChain, 1,
  397.                             End,
  398.                         End,
  399.                         Child, Label2(MSG_PRF_MP3SERVER),
  400.                         Child, HGroup,
  401.                             Child, ST_Server = TextinputObject,
  402.                                 StringFrame,
  403.                                 MUIA_Textinput_Multiline, FALSE,
  404.                                 MUIA_String_AdvanceOnCR, TRUE,
  405.                                 MUIA_CycleChain, 1,
  406.                                 MUIA_String_Accept, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-",
  407.                                 MUIA_ShortHelp, MSG_PRF_MP3SERVER_HELP,
  408.                             End,
  409.                             Child, Label2(MSG_PRF_SERVER_PORT),
  410.                             Child, ST_LeafPort = TextinputObject,
  411.                                 StringFrame,
  412.                                 MUIA_Textinput_Multiline, FALSE,
  413.                                 MUIA_HorizWeight, 45,
  414.                                 MUIA_String_Accept, "0123456789",
  415.                                 MUIA_String_MaxLen, 6,
  416.                                 MUIA_CycleChain, 1,
  417.                             End,
  418.                         End,
  419.                         Child, Label2(MSG_PRF_LISTENPORT),
  420.                         Child, HGroup,
  421.                             Child, ST_Port = TextinputObject,
  422.                                 StringFrame,
  423.                                 MUIA_Textinput_Multiline, FALSE,
  424.                                 MUIA_HorizWeight, 90,
  425.                                 MUIA_String_Integer, prf->port,
  426.                                 MUIA_String_Accept, "0123456789",
  427.                                 MUIA_String_MaxLen, 6,
  428.                                 MUIA_CycleChain, 1,
  429.                                 MUIA_ShortHelp, MSG_PRF_LISTENPORT_HELP,
  430.                             End,
  431.                             Child, Label2(MSG_PRF_BEHINDFW),
  432.                             Child, TG_Firewall = ImageObject,
  433.                                 ButtonFrame,
  434.                                 MUIA_HorizWeight, 10,
  435.                                 MUIA_Background, MUII_ButtonBack,
  436.                                 MUIA_InputMode, MUIV_InputMode_Toggle,
  437.                                 MUIA_ShowSelState, FALSE,
  438.                                 MUIA_Image_Spec, "6:15",
  439.                                 MUIA_Selected, FALSE,
  440.                                 MUIA_ShortHelp, MSG_PRF_BEHINDFW_HELP,
  441.                             End,
  442.                         End,
  443.                     End,
  444.                 End,
  445.                 Child, VGroup, GroupFrameT(MSG_PRF_TRANSFER_FRAME),
  446.                     Child, ColGroup(4),
  447.                         Child, Label2(MSG_PRF_DLQUEUE),
  448.                         Child, SL_DownloadQueue = NewObject(QueueClass->mcc_Class, 0,
  449.                             MUIA_Slider_Min, 1,
  450.                             MUIA_Slider_Max, 26,
  451.                             MUIA_Numeric_Value, 26,
  452.                             MUIA_CycleChain, 1,
  453.                             MUIA_ShortHelp, MSG_PRF_DLQUEUE_HELP,
  454.                             TAG_DONE),
  455.                         Child, Label2(MSG_PRF_TASKPRI),
  456.                         Child, SL_DownloadPri = NumericbuttonObject,
  457.                             MUIA_Numeric_Min, -128,
  458.                             MUIA_Numeric_Max, 0,
  459.                             MUIA_ShortHelp, MSG_PRF_TASKPRI_HELP,
  460.                         End,
  461.                         Child, Label2(MSG_PRF_ULQUEUE),
  462.                         Child, SL_UploadQueue = NewObject(QueueClass->mcc_Class, 0,
  463.                             MUIA_Slider_Min, 0,
  464.                             MUIA_Slider_Max, 26,
  465.                             MUIA_Numeric_Value, 5,
  466.                             MUIA_CycleChain, 1,
  467.                             MUIA_ShortHelp, MSG_PRF_ULQUEUE_HELP,
  468.                             TAG_DONE),
  469.                         Child, Label2(MSG_PRF_TASKPRI),
  470.                         Child, SL_UploadPri = NumericbuttonObject,
  471.                             MUIA_Numeric_Min, -128,
  472.                             MUIA_Numeric_Max, 0,
  473.                             MUIA_ShortHelp, MSG_PRF_TASKPRI_HELP,
  474.                         End,
  475.                     End,
  476.                     Child, HGroup,
  477.                         Child, Label2(MSG_PRF_RETRIES),
  478.                         Child, ST_QueueRetries = TextinputObject,
  479.                             StringFrame,
  480.                             MUIA_Textinput_Multiline, FALSE,
  481.                             MUIA_String_Integer, prf->QueueRetries,
  482.                             MUIA_String_Accept, "0123456789",
  483.                             MUIA_String_MaxLen, 6,
  484.                             MUIA_CycleChain, 1,
  485.                             MUIA_ShortHelp, MSG_PRF_RETRIES_HELP,
  486.                         End,
  487.                         Child, Label2(MSG_PRF_RETRYDELAY),
  488.                         Child, ST_QueueDelay = TextinputObject,
  489.                             StringFrame,
  490.                             MUIA_Textinput_Multiline, FALSE,
  491.                             MUIA_String_Integer, prf->QueueDelay,
  492.                             MUIA_String_Accept, "0123456789",
  493.                             MUIA_String_MaxLen, 6,
  494.                             MUIA_CycleChain, 1,
  495.                             MUIA_ShortHelp, MSG_PRF_RETRYDELAY_HELP,
  496.                         End,
  497.                     End,
  498.                 End,
  499.             End,
  500.             End,
  501.             Child, HGroup,
  502.                 Child, BT_Save   = SimpleButton(MSG_PRF_SAVE_GAD  ),
  503.                 Child, BT_Use    = SimpleButton(MSG_PRF_USE_GAD   ),
  504.                 Child, BT_Cancel = SimpleButton(MSG_PRF_CANCEL_GAD),
  505.             End,
  506.  
  507.         End,
  508.         TAG_MORE, msg->ops_AttrList))
  509.     {
  510.         data = INST_DATA(cl,obj);
  511.  
  512.         data->ST_User          = ST_User;
  513.         data->ST_Password      = ST_Password;
  514.         data->ST_EMail         = ST_EMail;
  515.         data->TG_BypassReg     = TG_BypassReg;
  516.         data->ST_DLPath        = ST_DLPath;
  517.         data->CY_LinkSpeed     = CY_LinkSpeed;
  518.  
  519.         data->TG_ClearList     = TG_ClearList;
  520.         data->TG_AutoConnect   = TG_AutoConnect;
  521.         data->TG_AskFile       = TG_AskFile;
  522.         data->TG_AutoSave      = TG_AutoSave;
  523.         data->TG_AutoAdd       = TG_AutoAdd;
  524.         data->CY_Lamp          = CY_Lamp;
  525.         data->CY_ServerList    = CY_ServerList;
  526.         data->CY_AutoCleanup   = CY_AutoCleanup;
  527.         data->ST_NameLength    = ST_NameLength;
  528.  
  529.         data->LI_Event         = LI_Event;
  530.         data->ST_EventScript   = ST_EventScript;
  531.         data->ST_EventSound    = ST_EventSound;
  532.  
  533.         data->ST_MetaServer    = ST_MetaServer;
  534.         data->ST_Server        = ST_Server;
  535.         data->ST_MetaPort      = ST_MetaPort;
  536.         data->ST_LeafPort      = ST_LeafPort;
  537.         data->ST_Port          = ST_Port;
  538.         data->TG_Firewall      = TG_Firewall;
  539.         data->SL_DownloadQueue = SL_DownloadQueue;
  540.         data->SL_DownloadPri   = SL_DownloadPri;
  541.         data->SL_UploadQueue   = SL_UploadQueue;
  542.         data->SL_UploadPri     = SL_UploadPri;
  543.         data->ST_QueueRetries  = ST_QueueRetries;
  544.         data->ST_QueueDelay    = ST_QueueDelay;
  545.  
  546.         data->lastitem = -1;
  547.  
  548.         DoMethod(EMailButton,   MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, PRF_UPDATE);
  549.         DoMethod(LI_Event,      MUIM_Notify, MUIA_NList_EntryClick, MUIV_EveryTime, obj, 1, PRF_ENTRY);
  550.         DoMethod(BT_EventTest,  MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, PRF_TESTSND);
  551.         DoMethod(TG_Firewall,   MUIM_Notify, MUIA_Selected, MUIV_EveryTime, data->ST_Port, 3, MUIM_Set, MUIA_Disabled, MUIV_TriggerValue);
  552.  
  553.         DoMethod(ST_QueueDelay, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, obj, 1, PRF_VALIDDELAY);
  554.  
  555.         DoMethod(BT_Save,       MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_SAVE  );
  556.         DoMethod(BT_Use,        MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_USE   );
  557.         DoMethod(BT_Cancel,     MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_CANCEL);
  558.  
  559.         DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_CANCEL);
  560.  
  561.         return((ULONG)obj);
  562.     }
  563.     return(0);
  564. }
  565.  
  566.  
  567. void prf_set(struct prfdata *data)
  568. {
  569.     set(data->ST_User,         MUIA_String_Contents, prf->user);
  570.     set(data->ST_Password,     MUIA_String_Contents, prf->pass);
  571.     set(data->ST_EMail,        MUIA_String_Contents, prf->email);
  572.     set(data->TG_BypassReg,    MUIA_Selected,        prf->BypassRegistration);
  573.     set(data->ST_DLPath,       MUIA_String_Contents, prf->dlpath);
  574.     set(data->CY_LinkSpeed,    MUIA_Cycle_Active,    prf->link);
  575.  
  576.     set(data->TG_ClearList,    MUIA_Selected,       prf->clrlist);
  577.     set(data->TG_AutoConnect,  MUIA_Selected,       prf->autocon);
  578.     set(data->TG_AskFile,      MUIA_Selected,       prf->askfile);
  579.     set(data->TG_AutoAdd,      MUIA_Selected,       prf->autoadd);
  580.     set(data->TG_AutoSave,     MUIA_Selected,       prf->autosave);
  581.     set(data->CY_Lamp,         MUIA_Cycle_Active,   prf->lamps);
  582.     set(data->CY_ServerList,   MUIA_Cycle_Active,   prf->ServerList);
  583.     set(data->CY_AutoCleanup,  MUIA_Cycle_Active,   prf->AutoCleanup);
  584.     set(data->ST_NameLength,   MUIA_String_Integer, prf->NameLength);
  585.  
  586.     set(data->ST_MetaServer,   MUIA_String_Contents, prf->MetaServer);
  587.     set(data->ST_MetaPort,     MUIA_String_Integer,  prf->MetaPort);
  588.     set(data->ST_Server,       MUIA_String_Contents, prf->LeafServer);
  589.     set(data->ST_LeafPort,     MUIA_String_Integer,  prf->LeafPort);
  590.  
  591.     set(data->ST_Port, MUIA_String_Integer, prf->port);
  592.     if (prf->port)
  593.         set(data->TG_Firewall, MUIA_Selected, FALSE);
  594.     else {
  595.         set(data->TG_Firewall, MUIA_Selected, TRUE);
  596.         set(data->ST_Port, MUIA_String_Integer, PRF_DEFAULT_PORT);
  597.     }
  598.     set(data->SL_DownloadQueue, MUIA_Numeric_Value,  prf->DownloadQueueLimit);
  599.     set(data->SL_DownloadPri,   MUIA_Numeric_Value,  prf->DownloadTaskPri   );
  600.     set(data->SL_UploadQueue,   MUIA_Numeric_Value,  prf->UploadQueueLimit  );
  601.     set(data->SL_UploadPri,     MUIA_Numeric_Value,  prf->UploadTaskPri     );
  602.     set(data->ST_QueueRetries,  MUIA_String_Integer, prf->QueueRetries      );
  603.     set(data->ST_QueueDelay,    MUIA_String_Integer, prf->QueueDelay        );
  604. }
  605.  
  606.  
  607. void prf_use(struct prfdata *data)
  608. {
  609.     u_long tmp, tmp2;
  610.  
  611.     /* Advanced */
  612.  
  613.     GetAttr(MUIA_String_Contents, data->ST_MetaServer, &tmp);
  614.     if (((char*)tmp)[0]==0) prf->MetaServer=NULL; else prf->MetaServer=strdup((char*)tmp);
  615.     GetAttr(MUIA_String_Integer, data->ST_MetaPort, &tmp);
  616.     if ((int)tmp < 65536) prf->MetaPort = (int)tmp;
  617.     else prf->MetaPort = 65535;
  618.  
  619.     GetAttr(MUIA_String_Contents, data->ST_Server, &tmp);
  620.     if (((char*)tmp)[0]==0) prf->LeafServer=NULL; else prf->LeafServer=strdup((char*)tmp);
  621.     GetAttr(MUIA_String_Integer, data->ST_LeafPort, &tmp);
  622.     if ((int)tmp < 65536) prf->LeafPort = (int)tmp;
  623.     else prf->LeafPort = 65535;
  624.  
  625.     GetAttr(MUIA_Selected, data->TG_Firewall, &tmp);
  626.     if (!tmp) {
  627.         GetAttr(MUIA_String_Integer, data->ST_Port, &tmp);
  628.         if ((int)tmp < 65536) prf->port = (int)tmp;
  629.         else prf->port = 65535;
  630.     }
  631.     else prf->port = 0;
  632.  
  633.     GetAttr(MUIA_Numeric_Value, data->SL_DownloadQueue, &tmp);
  634.     if (tmp > prf->DownloadQueueLimit) {
  635.         /* Limit was raised, so we check the queue right away */
  636.         prf->DownloadQueueLimit = tmp;
  637.         DoMethod(gui->dwin, DL_CHECKQUEUE);
  638.     }
  639.     else prf->DownloadQueueLimit = tmp;
  640.  
  641.     GetAttr(MUIA_Numeric_Value, data->SL_DownloadPri, &tmp);
  642.     prf->DownloadTaskPri = tmp;
  643.  
  644.     GetAttr(MUIA_Numeric_Value, data->SL_UploadQueue, &tmp);
  645.     prf->UploadQueueLimit = tmp;
  646.  
  647.     GetAttr(MUIA_Numeric_Value, data->SL_UploadPri, &tmp);
  648.     prf->UploadTaskPri = tmp;
  649.  
  650.     GetAttr(MUIA_String_Integer, data->ST_QueueRetries, &tmp);
  651.     prf->QueueRetries = (int)tmp;
  652.  
  653.     GetAttr(MUIA_String_Integer, data->ST_QueueDelay, &tmp);
  654.     if ((int)tmp > 0) {
  655.         prf->QueueDelay = (int)tmp;
  656.         DoMethod(gui->dwin, DL_SETDELAY, prf->QueueDelay);
  657.     }
  658.  
  659.     /* User */
  660.  
  661.     GetAttr(MUIA_String_Contents, data->ST_User, &tmp);
  662.     if (((char*)tmp)[0]==0) prf->user=NULL; else prf->user=strdup((char*)tmp);
  663.  
  664.     GetAttr(MUIA_String_Contents, data->ST_Password, &tmp);
  665.     if (((char*)tmp)[0]==0) prf->pass=NULL; else prf->pass=strdup((char*)tmp);
  666.  
  667.     GetAttr(MUIA_String_Contents, data->ST_EMail, &tmp);
  668.     if (((char*)tmp)[0]==0) prf->email=NULL; else prf->email=strdup((char*)tmp);
  669.  
  670.     GetAttr(MUIA_Selected, data->TG_BypassReg, &tmp);
  671.     prf->BypassRegistration = tmp;
  672.  
  673.     GetAttr(MUIA_String_Contents, data->ST_DLPath, &tmp);
  674.     if (((char *)tmp)[0] == 0) prf->dlpath=NULL;
  675.     else {
  676.         prf->dlpath=strdup((char*)tmp);
  677.         DoMethod(gui->shwin, SHARE_SETDIR, prf->dlpath);
  678.     }
  679.  
  680.     /* Options */
  681.  
  682.     GetAttr(MUIA_Cycle_Active, data->CY_LinkSpeed, &tmp);
  683.     prf->link = tmp;
  684.  
  685.     GetAttr(MUIA_Selected, data->TG_ClearList, &tmp);
  686.     prf->clrlist = tmp;
  687.  
  688.     GetAttr(MUIA_Selected, data->TG_AutoConnect, &tmp);
  689.     prf->autocon = tmp;
  690.  
  691.     GetAttr(MUIA_Selected, data->TG_AskFile, &tmp);
  692.     prf->askfile = tmp;
  693.  
  694.     GetAttr(MUIA_Selected, data->TG_AutoAdd, &tmp);
  695.     prf->autoadd = tmp;
  696.  
  697.     GetAttr(MUIA_Selected, data->TG_AutoSave, &tmp);
  698.     prf->autosave = tmp;
  699.  
  700.     GetAttr(MUIA_Cycle_Active, data->CY_Lamp, &tmp);
  701.     prf->lamps = tmp;
  702.  
  703.     GetAttr(MUIA_Cycle_Active, data->CY_AutoCleanup, &tmp);
  704.     prf->AutoCleanup = tmp;
  705.  
  706.     GetAttr(MUIA_Cycle_Active, data->CY_ServerList, &tmp);
  707.     prf->ServerList = tmp;
  708.  
  709.     GetAttr(MUIA_String_Integer, data->ST_NameLength, &tmp);
  710.     if ((int)tmp > 7 && (int)tmp < 108) prf->NameLength = (int)tmp;
  711.  
  712.     /* Events */
  713.  
  714.     GetAttr(MUIA_NList_Active, data->LI_Event, &tmp);
  715.     if (tmp != MUIV_NList_Active_Off) {
  716.         if (prf_eventflags[tmp]&1) {
  717.             GetAttr(MUIA_String_Contents, data->ST_EventScript, &tmp2);
  718.             if (((char*)tmp2)[0]==0) prf->scripts[tmp]=NULL;
  719.             else prf->scripts[tmp]=strdup((char*)tmp2);
  720.         }
  721.         if (prf_eventflags[tmp]&2) {
  722.             GetAttr(MUIA_String_Contents, data->ST_EventSound, &tmp2);
  723.             if (((char*)tmp2)[0]==0) prf->sounds[tmp]=NULL;
  724.             else prf->sounds[tmp]=strdup((char*)tmp2);
  725.         }
  726.     }
  727.  
  728.     prf_save("ENV:"AMSTER_PREFS);
  729. }
  730.  
  731.  
  732. void prf_setup(int argc, char *argv[])
  733. {
  734.     int i;
  735.     memset(prf,0,sizeof(struct prefsdata));
  736.  
  737.     /* defaults */
  738.     prf->MetaServer = "server.napster.com";
  739.     prf->MetaPort = 8875;
  740.     prf->napvers = "Amster "AMSTER_VERSION;
  741.     prf->port = PRF_DEFAULT_PORT;
  742.     prf->email = "anon@napster.com";
  743.     prf->BypassRegistration = FALSE;
  744.     prf->dlpath = "SYS:";
  745.     prf->link = 0;
  746.     prf->NameLength = 107;
  747.     prf->DownloadQueueLimit = 26;
  748.     prf->UploadQueueLimit = 2;
  749.     prf->UploadTaskPri = -1;
  750.     prf->QueueRetries = 180;
  751.     prf->QueueDelay = 20;
  752.     prf->regflag = 1;    /*  >:)  */
  753.     prf->noiconpanel = 1;
  754.     for (i=0; i<8; i++) {
  755.         prf->ColumnOrder[i] = i;
  756.     }
  757.     prf->ColumnOrder[8] = -1;
  758. }
  759.  
  760.  
  761. BOOL prf_load(char *fname)
  762. {
  763.     FILE *f;
  764.     char tmp[100], *s, *c;
  765.     int i;
  766.     u_long t;
  767.  
  768.     f=fopen(fname,"r");
  769.     if(f==0) return FALSE;
  770.  
  771.     while (fgets(tmp, sizeof(tmp), f)) {
  772.         s = strtok(tmp," ");
  773.         if (!s) {
  774.             continue;
  775.         }
  776.         else if (strcmp(s, "<search>")==0) {
  777.             while(fgets(tmp, sizeof(tmp), f)) {
  778.                 s = &tmp[0];
  779.                 c = nap_token(&s);
  780.                 if (!c) continue;
  781.                 else if(strcmp(c,"</search>")==0) break;
  782.                 else if(strcmp(c,"max")==0) {
  783.                     t = nap_ltoken(&s);
  784.                     if(t>2 && t<1000) prf->max = t;
  785.                 }
  786.                 else if(strcmp(c,"advopts")==0) {
  787.                     prf->speedqual   = nap_ltoken(&s);
  788.                     prf->speedval    = nap_ltoken(&s);
  789.                     prf->bitratequal = nap_ltoken(&s);
  790.                     prf->bitrateval  = nap_ltoken(&s);
  791.                     prf->freqqual    = nap_ltoken(&s);
  792.                     prf->freqval     = nap_ltoken(&s);
  793.                 }
  794.             }
  795.         } else if(strcmp(s,"columnorder")==0) {
  796.             s += 12;
  797.             prf->ColumnOrder[0] = nap_ltoken(&s);
  798.             prf->ColumnOrder[1] = nap_ltoken(&s);
  799.             prf->ColumnOrder[2] = nap_ltoken(&s);
  800.             prf->ColumnOrder[3] = nap_ltoken(&s);
  801.             prf->ColumnOrder[4] = nap_ltoken(&s);
  802.             prf->ColumnOrder[5] = nap_ltoken(&s);
  803.             prf->ColumnOrder[6] = nap_ltoken(&s);
  804.             prf->ColumnOrder[7] = nap_ltoken(&s);
  805.         } else if(strcmp(s,"iconpanel")==0) {
  806.             prf->noiconpanel = 0;
  807.         } else if(strcmp(s,"metaserver")==0) {
  808.             if(s=strtok(NULL,"\n")) prf->MetaServer=strdup(s);
  809.         } else if(strcmp(s,"leafserver")==0) {
  810.             if(s=strtok(NULL,"\n")) prf->LeafServer=strdup(s);
  811.         } else if(strcmp(s,"metaport")==0) {
  812.             if(s=strtok(NULL,"\n")) prf->MetaPort = atoi(s);
  813.         } else if(strcmp(s,"leafport")==0) {
  814.             if(s=strtok(NULL,"\n")) prf->LeafPort = atoi(s);
  815.         } else if(strcmp(s,"listport")==0) {
  816.             if(s=strtok(NULL,"\n")) prf->port = atoi(s);
  817.         } else if(strcmp(s,"downloadqueue")==0) {
  818.             if(s=strtok(NULL,"\n")) prf->DownloadQueueLimit = atoi(s);
  819.         } else if(strcmp(s,"downloadpriority")==0) {
  820.             if(s=strtok(NULL,"\n")) prf->DownloadTaskPri = atoi(s);
  821.         } else if(strcmp(s,"uploadqueue")==0) {
  822.             if(s=strtok(NULL,"\n")) prf->UploadQueueLimit = atoi(s);
  823.         } else if(strcmp(s,"uploadpriority")==0) {
  824.             if(s=strtok(NULL,"\n")) prf->UploadTaskPri = atoi(s);
  825.         } else if(strcmp(s,"queueretries")==0) {
  826.             if(s=strtok(NULL,"\n")) prf->QueueRetries = atoi(s);
  827.         } else if(strcmp(s,"queuedelay")==0) {
  828.             if(s=strtok(NULL,"\n")) {
  829.                 t = atoi(s);
  830.                 if (t > 0) prf->QueueDelay = t;
  831.             }
  832.  
  833.         }
  834.         else if (strcmp(s,"script")==0) {
  835.             if (s=strtok(NULL," ")) {
  836.                 if (strcmp(s, "startup") == 0 && (s = strtok(NULL, "\n"))) {
  837.                     prf->scripts[PRFE_STARTUP] = strdup(s);
  838.                 } else if (strcmp(s, "exit") == 0 && (s = strtok(NULL, "\n"))) {
  839.                     prf->scripts[PRFE_EXIT] = strdup(s);
  840.                 } else if (strcmp(s, "connect") == 0 && (s = strtok(NULL, "\n"))) {
  841.                     prf->scripts[PRFE_CONNECT] = strdup(s);
  842.                 } else if (strcmp(s, "disconnect") == 0 && (s = strtok(NULL, "\n"))) {
  843.                     prf->scripts[PRFE_DISCONNECT] = strdup(s);
  844.                 } else if (strcmp(s, "downloadstart") == 0 && (s = strtok(NULL, "\n"))) {
  845.                     prf->scripts[PRFE_DLSTART] = strdup(s);
  846.                 } else if (strcmp(s, "uploadstart") == 0 && (s = strtok(NULL, "\n"))) {
  847.                     prf->scripts[PRFE_ULSTART] = strdup(s);
  848.                 } else if (strcmp(s, "dlfinish") == 0 && (s = strtok(NULL, "\n"))) {
  849.                     prf->scripts[PRFE_DLFINISH] = strdup(s);
  850.                 } else if (strcmp(s, "ulfinish") == 0 && (s = strtok(NULL, "\n"))) {
  851.                     prf->scripts[PRFE_ULFINISH] = strdup(s);
  852.                 } else if (strcmp(s, "downloaderror") == 0 && (s = strtok(NULL, "\n"))) {
  853.                     prf->scripts[PRFE_DLERROR] = strdup(s);
  854.                 } else if (strcmp(s, "uploaderror") == 0 && (s = strtok(NULL, "\n"))) {
  855.                     prf->scripts[PRFE_ULERROR] = strdup(s);
  856.                 } else if (strcmp(s, "transerror") == 0 && (s = strtok(NULL, "\n"))) {
  857.                     prf->scripts[PRFE_DLERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
  858.                     prf->scripts[PRFE_ULERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
  859.                 } else if (strcmp(s, "downloadabort") == 0 && (s = strtok(NULL, "\n"))) {
  860.                     prf->scripts[PRFE_DLABORT] = strdup(s);
  861.                 } else if (strcmp(s, "uploadabort") == 0 && (s = strtok(NULL, "\n"))) {
  862.                     prf->scripts[PRFE_ULABORT] = strdup(s);
  863.                 } else if (strcmp(s, "incomingmsg") == 0 && (s = strtok(NULL, "\n"))) {
  864.                     prf->scripts[PRFE_INMSG] = strdup(s);
  865.                 } else if (strcmp(s, "librarydoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
  866.                     prf->scripts[PRFE_LIB_DCLICK] = strdup(s);
  867.                 } else if (strcmp(s, "downloaddoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
  868.                     prf->scripts[PRFE_DL_DCLICK] = strdup(s);
  869.                 } else if (strcmp(s, "mp3play") == 0 && (s = strtok(NULL, "\n"))) {
  870.                     prf->scripts[PRFE_PLAYMP3] = strdup(s);
  871.                 }
  872.             }
  873.  
  874.         }
  875.         else if (strcmp(s,"sound")==0) {
  876.             if (s=strtok(NULL," ")) {
  877.                 /* Old */
  878.                 i = atoi(s);
  879.                 if (i>0 && i<8 && (s=strtok(NULL,"\n")))
  880.                     prf->sounds[i-1] = strdup(s);
  881.                 /* New */
  882.                 else {
  883.                     if (strcmp(s, "startup") == 0 && (s = strtok(NULL, "\n"))) {
  884.                         prf->sounds[PRFE_STARTUP] = strdup(s);
  885.                     } else if (strcmp(s, "exit") == 0 && (s = strtok(NULL, "\n"))) {
  886.                         prf->sounds[PRFE_EXIT] = strdup(s);
  887.                     } else if (strcmp(s, "connect") == 0 && (s = strtok(NULL, "\n"))) {
  888.                         prf->sounds[PRFE_CONNECT] = strdup(s);
  889.                     } else if (strcmp(s, "disconnect") == 0 && (s = strtok(NULL, "\n"))) {
  890.                         prf->sounds[PRFE_DISCONNECT] = strdup(s);
  891.                     } else if (strcmp(s, "downloadstart") == 0 && (s = strtok(NULL, "\n"))) {
  892.                         prf->sounds[PRFE_DLSTART] = strdup(s);
  893.                     } else if (strcmp(s, "uploadstart") == 0 && (s = strtok(NULL, "\n"))) {
  894.                         prf->sounds[PRFE_ULSTART] = strdup(s);
  895.                     } else if (strcmp(s, "dlfinish") == 0 && (s = strtok(NULL, "\n"))) {
  896.                         prf->sounds[PRFE_DLFINISH] = strdup(s);
  897.                     } else if (strcmp(s, "ulfinish") == 0 && (s = strtok(NULL, "\n"))) {
  898.                         prf->sounds[PRFE_ULFINISH] = strdup(s);
  899.                     } else if (strcmp(s, "downloaderror") == 0 && (s = strtok(NULL, "\n"))) {
  900.                         prf->sounds[PRFE_DLERROR] = strdup(s);
  901.                     } else if (strcmp(s, "uploaderror") == 0 && (s = strtok(NULL, "\n"))) {
  902.                         prf->sounds[PRFE_ULERROR] = strdup(s);
  903.                     } else if (strcmp(s, "transerror") == 0 && (s = strtok(NULL, "\n"))) {
  904.                         prf->sounds[PRFE_DLERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
  905.                         prf->sounds[PRFE_ULERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
  906.                     } else if (strcmp(s, "downloadabort") == 0 && (s = strtok(NULL, "\n"))) {
  907.                         prf->sounds[PRFE_DLABORT] = strdup(s);
  908.                     } else if (strcmp(s, "uploadabort") == 0 && (s = strtok(NULL, "\n"))) {
  909.                         prf->sounds[PRFE_ULABORT] = strdup(s);
  910.                     } else if (strcmp(s, "incomingmsg") == 0 && (s = strtok(NULL, "\n"))) {
  911.                         prf->sounds[PRFE_INMSG] = strdup(s);
  912.                     } else if (strcmp(s, "librarydoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
  913.                         prf->sounds[PRFE_LIB_DCLICK] = strdup(s);
  914.                     } else if (strcmp(s, "downloaddoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
  915.                         prf->sounds[PRFE_DL_DCLICK] = strdup(s);
  916.                     } else if (strcmp(s, "mp3play") == 0 && (s = strtok(NULL, "\n"))) {
  917.                         prf->sounds[PRFE_PLAYMP3] = strdup(s);
  918.                     }
  919.                 }
  920.  
  921.             }
  922.  
  923.         } else if(strcmp(s,"user")==0) {
  924.             if(s=strtok(NULL,"\n")) prf->user=strdup(s);
  925.         } else if(strcmp(s,"pass")==0) {
  926.             if(s=strtok(NULL,"\n")) prf->pass=strdup(s);
  927.         } else if(strcmp(s,"email")==0) {
  928.             if(s=strtok(NULL,"\n")) prf->email=strdup(s);
  929.         } else if(strcmp(s,"bypassreg")==0) {
  930.             prf->BypassRegistration = TRUE;
  931.         } else if(strcmp(s,"dlpath")==0) {
  932.             if(s=strtok(NULL,"\n")) prf->dlpath=strdup(s);
  933.         } else if(strcmp(s,"linktype")==0) {
  934.             if(s=strtok(NULL,"\n")) prf->link=atoi(s);
  935.         } else if(strcmp(s,"optclrlist")==0) {
  936.             prf->clrlist = 1;
  937.         } else if(strcmp(s,"autoconnect")==0) {
  938.             prf->autocon = 1;
  939.         } else if(strcmp(s,"fullpath")==0) {
  940.             prf->fullpath = 1;
  941.         } else if(strcmp(s,"alwaysaskfilename")==0) {
  942.             prf->askfile = 1;
  943.         } else if(strcmp(s,"autoaddshares")==0) {
  944.             prf->autoadd = 1;
  945.         } else if(strcmp(s,"autosaveshares")==0) {
  946.             prf->autosave = 1;
  947.         } else if(strcmp(s,"lamptype")==0) {
  948.             if(s=strtok(NULL,"\n")) prf->lamps=atoi(s);
  949.         } else if(strcmp(s,"autocleanup")==0) {
  950.             if(s=strtok(NULL,"\n")) prf->AutoCleanup=atoi(s);
  951.         } else if(strcmp(s,"serverlist")==0) {
  952.             if(s=strtok(NULL,"\n")) prf->ServerList=atoi(s);
  953.         } else if(strcmp(s,"namelength")==0) {
  954.             if(s=strtok(NULL,"\n")) {
  955.                 t = atoi(s);
  956.                 if (t > 7 && t < 108) prf->NameLength = t;
  957.             }
  958.         }
  959.     }
  960.     fclose(f);
  961.  
  962.     return TRUE;
  963. }
  964.  
  965.  
  966. void prf_save(char *fname)
  967. {
  968.     FILE *f;
  969.     u_long tmp;
  970.  
  971.     f=fopen(fname,"w");
  972.     if(f==0) {
  973.         gui_debug((char *)MSG_ERROR_SAVE);
  974.         return;
  975.     }
  976.  
  977.     GetAttr(MUIA_Menuitem_Checked,gui->iconpanelmenu,&tmp);
  978.     if (tmp==TRUE) fprintf(f,"iconpanel \n");
  979.  
  980.     /* Advanced */
  981.     if (prf->MetaServer) fprintf(f, "metaserver %s\n", prf->MetaServer);
  982.     if (prf->MetaPort)   fprintf(f, "metaport %d\n",   prf->MetaPort);
  983.     if (prf->LeafServer) fprintf(f, "leafserver %s\n", prf->LeafServer);
  984.     if (prf->LeafPort)   fprintf(f, "leafport %d\n",   prf->LeafPort);
  985.     fprintf(f, "listport %d\n", prf->port);
  986.     fprintf(f, "downloadqueue %d\n", prf->DownloadQueueLimit);
  987.     fprintf(f, "downloadpriority %d\n", prf->DownloadTaskPri);
  988.     fprintf(f, "uploadqueue %d\n", prf->UploadQueueLimit);
  989.     fprintf(f, "uploadpriority %d\n", prf->UploadTaskPri);
  990.     fprintf(f, "queueretries %d\n", prf->QueueRetries);
  991.     fprintf(f, "queuedelay %d\n", prf->QueueDelay);
  992.  
  993.     /* User */
  994.     if (prf->user) fprintf(f,"user %s\n",prf->user);
  995.     if (prf->pass) fprintf(f,"pass %s\n",prf->pass);
  996.     if (prf->email) fprintf(f,"email %s\n",prf->email);
  997.     if (prf->BypassRegistration) fprintf(f, "bypassreg \n");
  998.     if (prf->dlpath) fprintf(f,"dlpath %s\n",prf->dlpath);
  999.     fprintf(f,"linktype %d\n",prf->link);
  1000.  
  1001.     /* Options */
  1002.     if (prf->clrlist) fprintf(f,"optclrlist \n");
  1003.     if (prf->autocon) fprintf(f,"autoconnect \n");
  1004.     if (prf->fullpath) fprintf(f,"fullpath \n");
  1005.     if (prf->askfile) fprintf(f,"alwaysaskfilename \n");
  1006.     if (prf->autoadd) fprintf(f,"autoaddshares \n");
  1007.     if (prf->autosave) fprintf(f,"autosaveshares \n");
  1008.     fprintf(f, "lamptype %d\n", prf->lamps);
  1009.     fprintf(f, "autocleanup %d\n", prf->AutoCleanup);
  1010.     fprintf(f, "serverlist %d\n", prf->ServerList);
  1011.     fprintf(f, "namelength %d\n", prf->NameLength);
  1012.  
  1013.     /* Events */
  1014.     if (prf->scripts[PRFE_STARTUP])    fprintf(f, "script startup %s\n",             prf->scripts[PRFE_STARTUP]   );
  1015.     if (prf->sounds[PRFE_STARTUP])     fprintf(f, "sound startup %s\n",              prf->sounds[PRFE_STARTUP]    );
  1016.     if (prf->scripts[PRFE_EXIT])       fprintf(f, "script exit %s\n",                prf->scripts[PRFE_EXIT]      );
  1017.     if (prf->sounds[PRFE_EXIT])        fprintf(f, "sound exit %s\n",                 prf->sounds[PRFE_EXIT]       );
  1018.     if (prf->scripts[PRFE_CONNECT])    fprintf(f, "script connect %s\n",             prf->scripts[PRFE_CONNECT]   );
  1019.     if (prf->sounds[PRFE_CONNECT])     fprintf(f, "sound connect %s\n",              prf->sounds[PRFE_CONNECT]    );
  1020.     if (prf->scripts[PRFE_DISCONNECT]) fprintf(f, "script disconnect %s\n",          prf->scripts[PRFE_DISCONNECT]);
  1021.     if (prf->sounds[PRFE_DISCONNECT])  fprintf(f, "sound disconnect %s\n",           prf->sounds[PRFE_DISCONNECT] );
  1022.     if (prf->scripts[PRFE_DLSTART] )   fprintf(f, "script downloadstart %s\n",       prf->scripts[PRFE_DLSTART]   );
  1023.     if (prf->sounds[PRFE_DLSTART])     fprintf(f, "sound downloadstart %s\n",        prf->sounds[PRFE_DLSTART]    );
  1024.     if (prf->scripts[PRFE_ULSTART] )   fprintf(f, "script uploadstart %s\n",         prf->scripts[PRFE_ULSTART]   );
  1025.     if (prf->sounds[PRFE_ULSTART])     fprintf(f, "sound uploadstart %s\n",          prf->sounds[PRFE_ULSTART]    );
  1026.     if (prf->scripts[PRFE_DLFINISH])   fprintf(f, "script dlfinish %s\n",            prf->scripts[PRFE_DLFINISH]  );
  1027.     if (prf->sounds[PRFE_DLFINISH])    fprintf(f, "sound dlfinish %s\n",             prf->sounds[PRFE_DLFINISH]   );
  1028.     if (prf->scripts[PRFE_ULFINISH])   fprintf(f, "script ulfinish %s\n",            prf->scripts[PRFE_ULFINISH]  );
  1029.     if (prf->sounds[PRFE_ULFINISH])    fprintf(f, "sound ulfinish %s\n",             prf->sounds[PRFE_ULFINISH]   );
  1030.     if (prf->scripts[PRFE_DLERROR])    fprintf(f, "script downloaderror %s\n",       prf->scripts[PRFE_DLERROR]   );
  1031.     if (prf->sounds[PRFE_DLERROR])     fprintf(f, "sound downloaderror %s\n",        prf->sounds[PRFE_DLERROR]    );
  1032.     if (prf->scripts[PRFE_ULERROR])    fprintf(f, "script uploaderror %s\n",         prf->scripts[PRFE_ULERROR]   );
  1033.     if (prf->sounds[PRFE_ULERROR])     fprintf(f, "sound uploaderror %s\n",          prf->sounds[PRFE_ULERROR]    );
  1034.     if (prf->scripts[PRFE_DLABORT])    fprintf(f, "script downloadabort %s\n",       prf->scripts[PRFE_DLABORT]   );
  1035.     if (prf->sounds[PRFE_DLABORT])     fprintf(f, "sound downloadabort %s\n",        prf->sounds[PRFE_DLABORT]    );
  1036.     if (prf->scripts[PRFE_ULABORT])    fprintf(f, "script uploadabort %s\n",         prf->scripts[PRFE_ULABORT]   );
  1037.     if (prf->sounds[PRFE_ULABORT])     fprintf(f, "sound uploadabort %s\n",          prf->sounds[PRFE_ULABORT]    );
  1038.     if (prf->scripts[PRFE_INMSG])      fprintf(f, "script incomingmsg %s\n",         prf->scripts[PRFE_INMSG]     );
  1039.     if (prf->sounds[PRFE_INMSG])       fprintf(f, "sound incomingmsg %s\n",          prf->sounds[PRFE_INMSG]      );
  1040.     if (prf->scripts[PRFE_LIB_DCLICK]) fprintf(f, "script librarydoubleclick %s\n",  prf->scripts[PRFE_LIB_DCLICK]);
  1041.     if (prf->sounds[PRFE_LIB_DCLICK])  fprintf(f, "sound librarydoubleclick %s\n",   prf->sounds[PRFE_LIB_DCLICK] );
  1042.     if (prf->scripts[PRFE_DL_DCLICK])  fprintf(f, "script downloaddoubleclick %s\n", prf->scripts[PRFE_LIB_DCLICK]);
  1043.     if (prf->sounds[PRFE_DL_DCLICK])   fprintf(f, "sound downloaddoubleclick %s\n",  prf->sounds[PRFE_LIB_DCLICK] );
  1044.     if (prf->scripts[PRFE_PLAYMP3])    fprintf(f, "script mp3play %s\n",             prf->scripts[PRFE_PLAYMP3]   );
  1045.     if (prf->sounds[PRFE_PLAYMP3])     fprintf(f, "sound mp3play %s\n",              prf->sounds[PRFE_PLAYMP3]    );
  1046.  
  1047.     DoMethod(gui->searchpanel, SEARCH_GET);
  1048.  
  1049.     fprintf(f, "columnorder %d %d %d %d %d %d %d %d\n",
  1050.         prf->ColumnOrder[0],
  1051.         prf->ColumnOrder[1],
  1052.         prf->ColumnOrder[2],
  1053.         prf->ColumnOrder[3],
  1054.         prf->ColumnOrder[4],
  1055.         prf->ColumnOrder[5],
  1056.         prf->ColumnOrder[6],
  1057.         prf->ColumnOrder[7]);
  1058.  
  1059.     fprintf(f,"<search> \n");
  1060.     fprintf(f,"advopts");
  1061.     fprintf(f," %d",prf->speedqual);
  1062.     fprintf(f," %d",prf->speedval);
  1063.     fprintf(f," %d",prf->bitratequal);
  1064.     fprintf(f," %d",prf->bitrateval);
  1065.     fprintf(f," %d",prf->freqqual);
  1066.     fprintf(f," %d\n",prf->freqval);
  1067.     fprintf(f,"max %d\n",prf->max);
  1068.     fprintf(f,"</search>\n");
  1069.  
  1070.     fclose(f);
  1071. }
  1072.  
  1073.  
  1074. void prf_entry(struct prfdata *data)
  1075. {
  1076.     u_long tmp,tmp2;
  1077.  
  1078.     GetAttr(MUIA_NList_EntryClick, data->LI_Event, &tmp);
  1079.     set(data->ST_EventScript, MUIA_Disabled, FALSE);
  1080.     set(data->ST_EventSound,  MUIA_Disabled, FALSE);
  1081.     if (tmp==-1 || tmp==-2) return;
  1082.  
  1083.     if (data->lastitem != -1) {
  1084.         int i = data->lastitem;
  1085.         if (prf_eventflags[i]&1) {
  1086.             GetAttr(MUIA_String_Contents, data->ST_EventScript, &tmp2);
  1087.             if (((char*)tmp2)[0]==0) prf->scripts[i]=NULL;
  1088.             else prf->scripts[i]=strdup((char*)tmp2);
  1089.         }
  1090.         if (prf_eventflags[i]&2) {
  1091.             GetAttr(MUIA_String_Contents, data->ST_EventSound, &tmp2);
  1092.             if (((char*)tmp2)[0]==0) prf->sounds[i]=NULL;
  1093.             else prf->sounds[i]=strdup((char*)tmp2);
  1094.         }
  1095.     }
  1096.     data->lastitem = tmp;
  1097.  
  1098.     set(data->ST_EventScript, MUIA_String_Contents, prf->scripts[tmp]);
  1099.     set(data->ST_EventSound,  MUIA_String_Contents, prf->sounds[tmp]);
  1100.  
  1101.     if (!(prf_eventflags[tmp]&1))
  1102.         set(data->ST_EventScript, MUIA_Disabled, TRUE);
  1103.     if (!(prf_eventflags[tmp]&2))
  1104.         set(data->ST_EventSound, MUIA_Disabled, TRUE);
  1105. }
  1106.  
  1107.  
  1108. void prf_event(enum Event no, ...)
  1109. {
  1110.     char *tmp, *command;
  1111.     char buf[1024];
  1112.     va_list ap;
  1113.     BOOL alloc = FALSE;
  1114.     u_long stmp;
  1115.  
  1116.     if (prf_eventflags[no]&2 && prf->sounds[no])
  1117.         snd_play(prf->sounds[no]);
  1118.  
  1119.     if (prf_eventflags[no]&1 && prf->scripts[no]) {
  1120.         va_start(ap, no);
  1121.         sprintf(buf, "Run <>NIL: %s", prf->scripts[no]);
  1122.  
  1123.         switch (no) {
  1124.             case PRFE_DLSTART:
  1125.             case PRFE_ULSTART:
  1126.             case PRFE_DLFINISH:
  1127.             case PRFE_ULFINISH:
  1128.             case PRFE_DLERROR:
  1129.             case PRFE_ULERROR:
  1130.             case PRFE_DLABORT:
  1131.             case PRFE_ULABORT:
  1132.             case PRFE_LIB_DCLICK:
  1133.             case PRFE_DL_DCLICK:
  1134.             case PRFE_PLAYMP3:
  1135.                 if (command = strrep(buf, "%f", va_arg(ap, char *))) alloc = TRUE;
  1136.                 break;
  1137.             case PRFE_CONNECT:
  1138.                 {
  1139.                 char port[6];
  1140.  
  1141.                 if (tmp = strrep(buf, "%s", va_arg(ap, char *))) {
  1142.                     sprintf(port, "%ld", va_arg(ap, int));
  1143.                     if (command = strrep(tmp, "%p", port)) alloc = TRUE;
  1144.                     free(tmp);
  1145.                 }
  1146.                 break;
  1147.                 }
  1148.             case PRFE_INMSG:
  1149.                 {
  1150.                 if (tmp = strrep(buf, "%u", va_arg(ap, char *))) {
  1151.                     if (command = strrep(tmp, "%m", va_arg(ap, char *))) alloc = TRUE;
  1152.                     free(tmp);
  1153.                 }
  1154.                 break;
  1155.                 }
  1156.             default:
  1157.                 command = buf;
  1158.         }
  1159.  
  1160.         va_end(ap);
  1161.  
  1162.         GetAttr(MUIA_Application_Base, gui->app, &stmp);
  1163.         if (tmp = strrep(command, "%a", (char *)stmp)) {
  1164.             if (alloc) free(command);
  1165.             command = tmp;
  1166.             alloc = TRUE;
  1167.         }
  1168.  
  1169.         if (command) {
  1170.             Execute(command, 0, 0);
  1171.             if (alloc) free(command);
  1172.         }
  1173.     }
  1174. }
  1175.